// 使用channel来进行不同线程之间的通信
use std::sync::mpsc; // mpsc: multiple producer, single consumer, 即多生产者单消费者
use std::thread;
use std::time::Duration;
fn main() {
    let (tx, rx) = mpsc::channel(); // channel返回的是一个元组，第一个是发送者，第二个是接收者
    let tx1 = mpsc::Sender::clone(&tx); // 这里需要使用clone方法来创建一个新的发送者，因为原来的发送者已经被move到了另一个线程中
    // let handle = thread::spawn(move || {
    //     tx.send("hello this is from thread"); // 如果接收端已经被丢弃, 那就会导致panic
    // });

    // let receivedMsg = rx.recv().unwrap(); // 接收消息，如果接收不到消息，就会阻塞在这里, 假如所有发送端都关闭了，那么就会返回一个错误
    // println!("The msg is {}", receivedMsg);
    // // try_recv()方法不会阻塞，如果接收不到消息，就会返回一个错误
    // let receivedMsg2 = rx.try_recv().expect("fail to receive msg!!!!!");
    // println!("The msg2 is {}", receivedMsg2);

    // 将接收端当作一个迭代器来使用
    thread::spawn(move || {
        let vals = vec![
            String::from("hello"),
            String::from("this"),
            String::from("is"),
            String::from("from"),
            String::from("thread"),
        ];
        for val in vals {
            tx.send(val).unwrap();
            thread::sleep(Duration::from_millis(200)); // 模拟耗时操作
        };
    });

    // 使用克隆的发送
    thread::spawn(move || {
        let vals = vec![
            String::from("1.hello"),
            String::from("1.this"),
            String::from("1.is"),
            String::from("1.from"),
            String::from("1.thread"),
        ];
        for val in vals {
            tx1.send(val).unwrap();
            thread::sleep(Duration::from_millis(200)); // 模拟耗时操作
        };
    });

    // 使用迭代的方式接收消息, 这样就不用调用recv()方法了
    for received in rx {
        println!("received: {}", received);
    }
}
